package com.v.air.app.http;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.http.Header;
import org.apache.http.HttpEntity;

import android.content.Context;
import android.view.View;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.ResponseHandlerInterface;
import com.v.air.app.tools.NetworkTool;

/**
 * HTTP客户端操作工具类
 * 
 * @author Administrator
 * 
 */
public abstract class HttpTool {
	/** 异步的HTTP客户端实例 **/
	protected static AsyncHttpClient client = new AsyncHttpClient();
	/** 默认字符集 **/
	public static String DEFAULT_CHARSET = "UTF-8";

	public static final int DEFAULT_SOCKET_TIMEOUT = 30000;

	/**
	 * 模拟GET表单（无参数）
	 * 
	 * @param url
	 *            请求URL
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void get(Context context, String url,
			ResponseHandlerInterface responseHandler) {
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			client.get(url, responseHandler);
		}
	}



	/**
	 * 模拟GET表单（有参数）
	 * 
	 * @param context
	 *            上下文
	 * @param url
	 *            请求URL
	 * @param parmsMap
	 *            参数
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void get(Context context, String url,
			Map<String, ?> parmsMap, ResponseHandlerInterface responseHandler,
			String... charset) {
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			if (null != charset && charset.length > 0) {
				DEFAULT_CHARSET = charset[0];
			}
			client.get(context, url, fillParms(parmsMap, DEFAULT_CHARSET),
					responseHandler);
		}
	}

	/**
	 * 模拟POST表单（无参数）
	 * 
	 * @param url
	 *            请求URL
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void post(Context context, String url,
			ResponseHandlerInterface responseHandler) {
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			client.post(url, responseHandler);
		}
	}

	/**
	 * 模拟POST表单（有参数）
	 * 
	 * @param url
	 *            请求URL
	 * @param parmsMap
	 *            参数
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void post(Context context, String url, View loading,
			Map<String, ?> parmsMap, ResponseHandlerInterface responseHandler,
			String... charset) {
		client.setTimeout(DEFAULT_SOCKET_TIMEOUT);
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			if (null != charset && charset.length > 0) {
				DEFAULT_CHARSET = charset[0];
			}
			client.post(url, fillParms(parmsMap, DEFAULT_CHARSET),
					responseHandler);
		} else {
			if (loading != null)
				loading.setVisibility(View.GONE);
		}
	}

	public static void post(Context context, String url,
			Map<String, ?> parmsMap, ResponseHandlerInterface responseHandler,
			String... charset) {
		client.setTimeout(DEFAULT_SOCKET_TIMEOUT);
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			if (null != charset && charset.length > 0) {
				DEFAULT_CHARSET = charset[0];
			}

			client.post(url, fillParms(parmsMap, DEFAULT_CHARSET),
					responseHandler);
		}
	}

	/**
	 * 模拟POST表单（有参数）
	 * 
	 * @param url
	 *            请求URL
	 * @param parmsMap
	 *            参数
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void post(Context context, String url,
			Map<String, ?> parmsMap, View loading,
			ResponseHandlerInterface responseHandler, String... charset) {
		client.setTimeout(DEFAULT_SOCKET_TIMEOUT);

		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			if (null != charset && charset.length > 0) {
				DEFAULT_CHARSET = charset[0];
			}

			client.post(url, fillParms(parmsMap, DEFAULT_CHARSET),
					responseHandler);
		} else {
			if (loading != null)
				loading.setVisibility(View.GONE);
		}
	}

	/**
	 * 模拟提交POST表单（无参数）
	 * 
	 * @param context
	 *            上下文
	 * @param url
	 *            请求URL
	 * @param entity
	 *            请求实体,可以null
	 * @param contentType
	 *            表单contentType （"multipart/form-data"）
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void post(Context context, String url, HttpEntity entity,
			String contentType, ResponseHandlerInterface responseHandler) {
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			client.post(context, url, entity, contentType, responseHandler);
		}
	}

	/**
	 * 模拟提交POST表单（有参数）
	 * 
	 * @param context
	 *            上下文
	 * @param url
	 *            请求URL
	 * @param headers
	 *            请求Header
	 * @param parmsMap
	 *            参数
	 * @param contentType
	 *            表单contentType （"multipart/form-data"）
	 * @param responseHandler
	 *            回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/
	 *            TextHttpResponseHandler）
	 */
	public static void post(Context context, String url, Header[] headers,
			Map<String, ?> parmsMap, String contentType,
			ResponseHandlerInterface responseHandler, String... charset) {
		client.setTimeout(DEFAULT_SOCKET_TIMEOUT);
		if (checkNetwork(context)) {
			// 关闭过期连接.
			client.getHttpClient().getConnectionManager()
					.closeExpiredConnections();
			if (null != charset && charset.length > 0) {
				DEFAULT_CHARSET = charset[0];
			}
			client.post(context, url, headers,
					fillParms(parmsMap, DEFAULT_CHARSET), contentType,
					responseHandler);
		}
	}

	/**
	 * 装填参数
	 * 
	 * @param map
	 *            参数
	 * @return
	 */
	public static RequestParams fillParms(Map<String, ?> map, String charset) {
		RequestParams params = new RequestParams();
		if (null != map && map.entrySet().size() > 0) {
			// 设置字符集,防止参数提交乱码
			if (!"".equals(charset)) {
				params.setContentEncoding(charset);
			}
			for (Iterator iterator = map.entrySet().iterator(); iterator
					.hasNext();) {
				Entry entity = (Entry) iterator.next();
				Object key = entity.getKey();
				Object value = entity.getValue();
				if (value instanceof File) {
					try {
						params.put((String) key, new FileInputStream(
								(File) value), ((File) value).getName());
					} catch (FileNotFoundException e) {
						throw new RuntimeException("文件不存在！", e);
					}
				} else if (value instanceof InputStream) {
					params.put((String) key, (InputStream) value);
				} else {

					params.put((String) key, value.toString());
				}
			}
		}
		return params;
	}

	/**
	 * 检测网络状态
	 * 
	 * @return 网络是否连接
	 */
	public static boolean checkNetwork(Context context) {
		boolean isConnected = NetworkTool.getInstance().init(context)
				.isConnected();
		if (isConnected) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检测网络类型
	 * 
	 * @return
	 */
	public static boolean isWifi(Context context) {
		String type = NetworkTool.getInstance().getNetworkType();
		if (NetworkTool.NETWORK_WIFI.equalsIgnoreCase(type)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 停止请求
	 * 
	 * @param mContext
	 *            发起请求的上下文
	 */
	public static void stopRequest(Context mContext) {
		client.cancelRequests(mContext, true);
	}

	/**
	 * 停止全部请求
	 */
	public static void stopAllRequest() {
		client.cancelAllRequests(true);
	}

}
